home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CUCD / Programming / OUI / rcs / slist.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  4.3 KB  |  243 lines

  1. head    1.2;
  2. access;
  3. symbols;
  4. locks
  5.     dlorre:1.2; strict;
  6. comment    @// @;
  7.  
  8.  
  9. 1.2
  10. date    97.07.14.04.22.08;    author dlorre;    state Exp;
  11. branches;
  12. next    1.1;
  13.  
  14. 1.1
  15. date    96.08.22.02.05.10;    author dlorre;    state Exp;
  16. branches;
  17. next    ;
  18.  
  19.  
  20. desc
  21. @Oui.lib -- Object User Interface
  22. Projet créé en 1994
  23. Auteur: Dominique Lorre
  24. @
  25.  
  26.  
  27. 1.2
  28. log
  29. @index() renamed as indexof()
  30. @
  31. text
  32. @// list.cc
  33. // Date de création : 15/07/94
  34. // Auteur : Dominique Lorre
  35.  
  36. #include <exec/types.h>
  37. #include <string.h>
  38.  
  39. #include <proto/dos.h>
  40. #include <mydebug.h>
  41.  
  42. #include "slist.h"
  43.  
  44.  
  45. // =========================================================================
  46. // ========================== SLINK CLASS ==================================
  47. // =========================================================================
  48.  
  49. long slink::type() const
  50. {
  51.     return 0 ;
  52. }   // info for selection
  53.  
  54. slink::~slink()
  55. {
  56. }
  57.  
  58. long slink::indexof()
  59. {
  60. long n = 0 ;
  61. slink *c ;
  62.     c = this ;
  63.     while (c) {
  64.         n++ ;
  65.         c = c->pred ;
  66.     }
  67.     return n-1 ;
  68. }
  69.  
  70. // =========================================================================
  71. // ========================== SLIST CLASS ==================================
  72. // =========================================================================
  73.  
  74. slist::~slist()
  75. {
  76.     free() ;
  77. }
  78.  
  79. void slist::free()
  80. {
  81. slink *n, *c ;
  82.  
  83.     n = head ;
  84.     while (n) {
  85.         c = n->succ ;
  86.         delete n ;
  87.         n = c ;
  88.     }
  89.     init() ;
  90. }
  91.  
  92. void slist::addhead(slink *p)
  93. {
  94.     if (head) {
  95.         head->pred = p ;
  96.         p->succ = head ;
  97.     }
  98.     else {
  99.         tail = p ;
  100.         p->succ = NULL ;
  101.     }
  102.     head = p ;
  103.     p->pred = NULL ;
  104. }
  105.  
  106. void slist::addtail(slink *p)
  107. {
  108.     if (tail) {
  109.         tail->succ = p ;
  110.         p->pred = tail ;
  111.     }
  112.     else {
  113.         head = p ;
  114.         p->pred = NULL ;
  115.     }
  116.     tail = p ;
  117.     p->succ = NULL ;
  118. }
  119.  
  120. void slist::insert(slink *c, slink *p)
  121. {
  122.     if (!p)
  123.         addhead(c) ;
  124.     else if (p == tail)
  125.         addtail(c) ;
  126.     else  {
  127.         c->succ = p->succ ;
  128.         c->pred = p ;
  129.         p->succ->pred = c ;
  130.         p->succ = c ;
  131.     }
  132. }
  133.  
  134.  
  135. void slist::remove(slink *c)
  136. {
  137.     if (c->succ) {                      // le node a un successeur
  138.         if (c->pred) {                  // et un prédécesseur
  139.             c->succ->pred = c->pred ;   // -> ni en tête, ni en fin de liste
  140.             c->pred->succ = c->succ ;
  141.         }
  142.         else {                          // pas de prédécesseur :
  143.             head = c->succ ;            // tête de liste
  144.             c->succ->pred = NULL ;
  145.         }
  146.     }
  147.     else {                              // pas de successeur :
  148.         if (c->pred) {                  // un prédécesseur :
  149.             tail = c->pred ;            // queue de liste
  150.             c->pred->succ = NULL ;
  151.         }
  152.         else if ((c == tail) && (c == head)) {  // ni de prédécesseur
  153.             tail = head = NULL ;            // liste vide
  154.         }                                   // autre cas : le node a été remplacé
  155.     }
  156. }
  157.  
  158. slink * slist::get(long ind)
  159. {
  160. slink *c ;
  161. long n = 0 ;
  162.     c = head ;
  163.     while (c && n<ind) {
  164.         c = c->succ ;
  165.         n++ ;
  166.     }
  167.     return c ;
  168. }
  169.  
  170. void slist::replace(slink *anc, slink *nouv)
  171. {
  172.     nouv->succ = anc->succ ;
  173.     nouv->pred = anc->pred ;
  174.     if (nouv->succ)  nouv->succ->pred = nouv ;
  175.     if (nouv->pred)  nouv->pred->succ = nouv ;
  176.     if (anc == head) head = nouv ;
  177.     if (anc == tail) tail = nouv ;
  178.     anc->succ = NULL ;
  179.     anc->pred = NULL ;
  180. }
  181.  
  182.  
  183.  
  184. long slist::count()
  185. {
  186. slink *c = head ;
  187. long n = 0 ;
  188.     while (c) {
  189.         n++ ;
  190.         c = c->succ ;
  191.     }
  192.     return n ;
  193. }
  194.  
  195. // =========================================================================
  196. // ========================== NLIST CLASS ==================================
  197. // =========================================================================
  198.  
  199. nlink *nlist::findname(STRPTR name)
  200. {
  201. nlink *c = first() ;
  202.  
  203.     while (c && strcmp(c->label, name))
  204.         c = c->next() ;
  205.     return c ;
  206. }
  207.  
  208. void nlist::enqueue(nlink *node)
  209. {
  210. nlink *c = first() ;
  211.  
  212.     while (c && (stricmp(c->label, node->label) < 0)) {
  213.         c = c->next() ;
  214.     }
  215.     if (!c)
  216.         addtail(node) ;
  217.     else
  218.         insert(node, c->prev()) ;
  219. }
  220. @
  221.  
  222.  
  223. 1.1
  224. log
  225. @Initial revision
  226. @
  227. text
  228. @d8 2
  229. a9 9
  230. extern "C" {
  231. extern struct DosLibrary *DOSBase ;
  232. void Delay( long timeout );
  233. LONG Printf( STRPTR format, ... );
  234. #include <pragmas/dos_pragmas.h>
  235.  
  236. VOID kprintf(STRPTR format, ...) ;
  237. }
  238.  
  239. d27 1
  240. a27 1
  241. long slink::index()
  242. @
  243.